package ttt;

import java.util.Iterator;
import java.util.List;

/**
 *
 * @author Fénix
 */
class OponenteListo extends Oponente {
	
	public OponenteListo(Tablero tablero) {
		super(tablero);
	}
	
	private boolean compruebaCasilla(String codigo) {
		boolean tresEnRaya = false;
		
		if ("UL".equals(codigo)) {
			if((!tablero.getContenidoCasilla("UC").equals(Casilla.VACIA) &&	tablero.getContenidoCasilla("UC").equals(tablero.getContenidoCasilla("UR"))) ||
			   (!tablero.getContenidoCasilla("CC").equals(Casilla.VACIA) && tablero.getContenidoCasilla("CC").equals(tablero.getContenidoCasilla("DR"))) ||
			   (!tablero.getContenidoCasilla("CL").equals(Casilla.VACIA) && tablero.getContenidoCasilla("CL").equals(tablero.getContenidoCasilla("DL")))) {
				tresEnRaya = true;
			}
		} else if ("UC".equals(codigo)) {
			if((!tablero.getContenidoCasilla("UL").equals(Casilla.VACIA) &&	tablero.getContenidoCasilla("UL").equals(tablero.getContenidoCasilla("UR"))) ||
			   (!tablero.getContenidoCasilla("CC").equals(Casilla.VACIA) && tablero.getContenidoCasilla("CC").equals(tablero.getContenidoCasilla("DC")))) {
				tresEnRaya = true;
			}
		} else if ("UR".equals(codigo)) {
			if((!tablero.getContenidoCasilla("UC").equals(Casilla.VACIA) &&	tablero.getContenidoCasilla("UC").equals(tablero.getContenidoCasilla("UL"))) ||
			   (!tablero.getContenidoCasilla("CC").equals(Casilla.VACIA) && tablero.getContenidoCasilla("CC").equals(tablero.getContenidoCasilla("DL"))) ||
			   (!tablero.getContenidoCasilla("CR").equals(Casilla.VACIA) && tablero.getContenidoCasilla("CR").equals(tablero.getContenidoCasilla("DR")))) {
				tresEnRaya = true;
			}
		} else if ("CL".equals(codigo)) {
			if((!tablero.getContenidoCasilla("UL").equals(Casilla.VACIA) &&	tablero.getContenidoCasilla("UL").equals(tablero.getContenidoCasilla("DL"))) ||
			   (!tablero.getContenidoCasilla("CC").equals(Casilla.VACIA) && tablero.getContenidoCasilla("CC").equals(tablero.getContenidoCasilla("CR")))) {
				tresEnRaya = true;
			}
		} else if ("CL".equals(codigo)) {
			if((!tablero.getContenidoCasilla("UL").equals(Casilla.VACIA) &&	tablero.getContenidoCasilla("UL").equals(tablero.getContenidoCasilla("DL"))) ||
			   (!tablero.getContenidoCasilla("CC").equals(Casilla.VACIA) && tablero.getContenidoCasilla("CC").equals(tablero.getContenidoCasilla("CR")))) {
				tresEnRaya = true;
			}
		} else if ("CC".equals(codigo)) {
			if((!tablero.getContenidoCasilla("UL").equals(Casilla.VACIA) &&	tablero.getContenidoCasilla("UL").equals(tablero.getContenidoCasilla("DR"))) ||
			   (!tablero.getContenidoCasilla("UC").equals(Casilla.VACIA) && tablero.getContenidoCasilla("UC").equals(tablero.getContenidoCasilla("DC"))) ||
				(!tablero.getContenidoCasilla("UR").equals(Casilla.VACIA) && tablero.getContenidoCasilla("UR").equals(tablero.getContenidoCasilla("DL"))) ||
				(!tablero.getContenidoCasilla("CL").equals(Casilla.VACIA) && tablero.getContenidoCasilla("CL").equals(tablero.getContenidoCasilla("CR")))) {
				tresEnRaya = true;
			}
		} else if ("CR".equals(codigo)) {
			if((!tablero.getContenidoCasilla("UR").equals(Casilla.VACIA) &&	tablero.getContenidoCasilla("UR").equals(tablero.getContenidoCasilla("DR"))) ||
				(!tablero.getContenidoCasilla("CL").equals(Casilla.VACIA) && tablero.getContenidoCasilla("CL").equals(tablero.getContenidoCasilla("CC")))) {
				tresEnRaya = true;
			}
		} else if ("DL".equals(codigo)) {
			if((!tablero.getContenidoCasilla("DC").equals(Casilla.VACIA) &&	tablero.getContenidoCasilla("DC").equals(tablero.getContenidoCasilla("DR"))) ||
			   (!tablero.getContenidoCasilla("CC").equals(Casilla.VACIA) && tablero.getContenidoCasilla("CC").equals(tablero.getContenidoCasilla("UR"))) ||
			   (!tablero.getContenidoCasilla("CL").equals(Casilla.VACIA) && tablero.getContenidoCasilla("CL").equals(tablero.getContenidoCasilla("UL")))) {
				tresEnRaya = true;
			}
		} else if ("DC".equals(codigo)) {
			if((!tablero.getContenidoCasilla("DL").equals(Casilla.VACIA) &&	tablero.getContenidoCasilla("DL").equals(tablero.getContenidoCasilla("DR"))) ||
				(!tablero.getContenidoCasilla("CC").equals(Casilla.VACIA) && tablero.getContenidoCasilla("CC").equals(tablero.getContenidoCasilla("UC")))) {
				tresEnRaya = true;
			}
		} else if ("DR".equals(codigo)) {
			if((!tablero.getContenidoCasilla("CR").equals(Casilla.VACIA) &&	tablero.getContenidoCasilla("CR").equals(tablero.getContenidoCasilla("UR"))) ||
			   (!tablero.getContenidoCasilla("CC").equals(Casilla.VACIA) && tablero.getContenidoCasilla("CC").equals(tablero.getContenidoCasilla("UL"))) ||
			   (!tablero.getContenidoCasilla("DL").equals(Casilla.VACIA) && tablero.getContenidoCasilla("DL").equals(tablero.getContenidoCasilla("DC")))) {
				tresEnRaya = true;
			}
		}
		
		return tresEnRaya;
	}
	
	
	@Override
	public String casillaElegida() {
		
		String esquinaLibre = null;
		String eleccion = null;
		List<Casilla> opciones = tablero.getCasillasLibres();
		
		if (opciones.size()<9) {		
			boolean tresEnRaya = false;
			Iterator<Casilla> it = opciones.iterator();
			while (it.hasNext() && !tresEnRaya) {
				Casilla casilla = it.next();
				if (Casilla.VACIA.equals(casilla.getContenido())) {
					tresEnRaya = compruebaCasilla(casilla.getCodigo());
					if(tresEnRaya) {
						//Si es mi tres en raya, elijo esa jugada: gano.. :P
						if (!casilla.getContenido().equals(this.getNombreFicha())) {
							tresEnRaya = false;
						}
						eleccion = casilla.getCodigo();
					}
					
					if (esquinaLibre == null && casilla.getCodigo().matches("[U|D][R|L]")) {
						esquinaLibre = casilla.getCodigo();
					}
				}
			}
			
			//Si no hay posibilidad de hacer tres en raya ni de abortar uno...
			//Buscamos casilla central o la jugada ganadora o las esquinas.
			if (eleccion == null) {
				if(tablero.getContenidoCasilla("CC").equals(Casilla.VACIA)) {
					eleccion = "CC";
				} else if(!tablero.getContenidoCasilla("CL").equals(Casilla.VACIA) &&
						  !tablero.getContenidoCasilla("CL").equals(this.getNombreFicha())) {
					 if(tablero.getContenidoCasilla("UR").equals(Casilla.VACIA)) {
						 eleccion = "UR";
					 } else if (tablero.getContenidoCasilla("DR").equals(Casilla.VACIA)) {
						 eleccion = "DR";
					 }
				} else if(!tablero.getContenidoCasilla("UC").equals(Casilla.VACIA) &&
						  !tablero.getContenidoCasilla("UC").equals(this.getNombreFicha())) {
					 if(tablero.getContenidoCasilla("DL").equals(Casilla.VACIA)) {
						 eleccion = "DL";
					 } else if (tablero.getContenidoCasilla("DR").equals(Casilla.VACIA)) {
						 eleccion = "DR";
					 }
				} else if(!tablero.getContenidoCasilla("CR").equals(Casilla.VACIA) &&
						  !tablero.getContenidoCasilla("CR").equals(this.getNombreFicha())) {
					 if(tablero.getContenidoCasilla("UL").equals(Casilla.VACIA)) {
						 eleccion = "UL";
					 } else if (tablero.getContenidoCasilla("DL").equals(Casilla.VACIA)) {
						 eleccion = "DL";
					 }
				} else if(!tablero.getContenidoCasilla("DC").equals(Casilla.VACIA) &&
						  !tablero.getContenidoCasilla("DC").equals(this.getNombreFicha())) {
					 if(tablero.getContenidoCasilla("UR").equals(Casilla.VACIA)) {
						 eleccion = "UR";
					 } else if (tablero.getContenidoCasilla("UL").equals(Casilla.VACIA)) {
						 eleccion = "UL";
					 }
				} else if (esquinaLibre != null) {
					eleccion = esquinaLibre;
				}
				
				if (eleccion == null) {
					//Aleatoriio! :)
					int eleccionI = (int)(Math.random() * 100) % opciones.size();
					eleccion = opciones.get(eleccionI).getCodigo();
				}
			}
		} else {
			eleccion = "CC";
		}
		
		this.miTurno = false;
		return eleccion;
	}

}
